package cn.demoncat.util.mq.entity;

import cn.demoncat.util.lang.JsonUtil;
import cn.demoncat.util.mq.constant.MqLogMsg;
import org.slf4j.Logger;

/**
 * 消息发送回调
 * 
 * 1、自定义回调时，继承本类并重写success和error方法
 * 2、不需要指定log,topic,content等参数，由MqUtil统一指定
 * 
 * @author 延晓磊
 *
 * @since 2018年8月10日
 */
public abstract class MqCallback{

	// 日志
	private Logger log;
	// 主题
	private String topic;
	// KEY
	private String key;
	// 内容
	private MqMessage content;
 
	/**
	 * 发送成功回调
	 * 
	 * @param topic
	 * @param key
	 * @param content
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月14日
	 */
	public abstract void success(String topic, String key, MqMessage content);

	/**
	 * 发送失败回调
	 * 
	 * @param ex
	 * @param topic
	 * @param key
	 * @param content
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月14日
	 */
	public abstract void error(Throwable ex, String topic, String key, MqMessage content);
	
	/**
	 * 发送成功
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年8月10日
	 *
	 */
	public final void onSuccess() {
		log.info(JsonUtil.toStr(new MqLog(MqLogMsg.SEND_SUCCESS, topic, content)));
		success(topic,key,content);
	}

	/**
	 * 发送失败
	 * 
	 * @param ex
	 *
	 * @author 延晓磊
	 *
	 * @since 2018年8月10日
	 *
	 */
	public final void onFailure(Throwable ex) {
		log.error(JsonUtil.toStr(new MqLog(MqLogMsg.SEND_ERROR, topic, content)),ex);
		error(ex,topic,key,content);
	}

	public final Logger getLog() {
		return log;
	}

	public final void setLog(Logger log) {
		this.log = log;
	}
	public final String getTopic() {
		return topic;
	}

	public final void setTopic(String topic) {
		this.topic = topic;
	}

	public final MqMessage getContent() {
		return content;
	}

	public final void setContent(MqMessage content) {
		this.content = content;
	}

	public final String getKey() {
		return key;
	}

	public final void setKey(String key) {
		this.key = key;
	}
 
}
